PHP 魔术方法
魔术方法
PHP中,将所有以__
(两个下划线)开头的类方法保留位魔术方法,所以在定义类方法时,不建议使用__
作为方法的前缀。下面分别介绍每个魔术方法的作用。
__get __set __isset __unset
方法
__get __set __isset __unset
这些魔术方法为在类和他们的父类中没有声明的属性而设计的
在访问类属性的时候,如果属性可以访问,则直接返回;若不可以访问,则调用__get函数
方法签名:
1
public mixed __get(string $name)
在设置一个对象的属性时,若对象可以访问,则直接赋值,若不可以访问,则调用
__set
方法方法签名:
1
public void __set(string $name , mixed $value)
当对不可访问的属性调用
isset()
或empty()
时,__isset()
会被调用方法签名:
1
public bool __isset(string $name)
当对不可访问的属性调用
unset()
时,__unset()
会被调用方法签名:
1
public bool __unset(string $name)
注意:
以上存在的不可访问不仅仅是属性没有定义,当属性的访问控制为
proteced
或private
时,也属于不可访问的情况
实例:
1 | class Demo{ |
执行结果:
1 | wertycn |
__construct
__destruct
方法
__construct()
构造函数,实例化对象时被调用__destruct()
析构函数,当对象被销毁时被调用。通常情况下,PHP只会释放对象所占有的内存和相关的资源,对于程序员自己申请的资源,需要显式的去释放。通常可以把需要释放资源的操作放到析构方法中,这样可以保证在对象被释放的时候,自己申请的资源也能被释放。
实例:
在构造函数中打开一个文件,然后再析构函数中关闭文件
1 | class Demo{ |
也可以用在创建数据库连接和销毁数据库连接中等等
__call()
方法和__callStatic()
__call($method,$arg_array)
: 当调用一个不可访问的方法时会自动调用这个方法方法签名:
1
public void function __call(string $name,array $arguments)
__callStatic()
与__call
方法类似,当调用的静态方法不存在时,会自动调用这个方法1
public void function __callStatic(string $name,array $arguments)
实例:
1 |
|
执行结果:
1 | 调用了一个不可访问的的静态对象方法get |
拓展:
__call
方法在设计流接口模式(链式调用)时经常用到,如ThinkPHP5的Db类,就使用了__callStatic
方法,调用查询构建器中的方法,配合call_user_func_array
方法和return $this
实现,示例如下:
1 |
|
注意 : 在使用call_user_func_array()时注意return
执行结果:
1 | =========================== |
__sleep()和__wakeup()
方法
__sleep()
串行化的时候调用__wakeup()
反串行化的时候调用
在执行
serialize()
和unserialize()
时,会优先调用这两个函数串行化用于对对象的存储或者传输,通过反串行化得到这个对象。通过串行化,可以将数据对象转换成二进制数据格式